package com.sleep.ws.server.utils;

import org.joda.time.DateTime;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTimeUtil {

    public static String format1 = "yyyy-MM-dd HH:mm:ss";
    public static String format2 = "yyyy-MM-dd HH:mm:ss.S";
    public static String format3 = "yyyyMMddHHmmssSSS";

    public static String format4 = "yyyy-MM-dd";
    public static String format5 = "yyyyMMddHHmmss";
    public static String format6 = "yyyy/M/d H:m:s";

    public static String toFormat1(String dt) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format2)).toString(format1);
    }

    public static String timestampToString(long timestamp){
        if(!(timestamp > 0L)){
            return "";
        }
        return new DateTime(timestamp).toString(format1);
    }



    /**
     * 返回当前时间
     * 格式为yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getCurDateTime() {
        return LocalDateTime.now().toString(format1);
    }

    /**
     * 返回当前日期
     * 格式为yyyy-MM-dd
     *
     * @return
     */
    public static String getCurDate() {
        return LocalDateTime.now().toString(format4);
    }

    /**
     * 返回当前时间
     * 格式为yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getCurDateTime(String format) {
        return LocalDateTime.now().toString(format);
    }

    /**
     * 返回当前时间加几天
     *
     * @param days
     * @return
     */
    public static String curDaysPlusDay(int days) {
        return LocalDateTime.now().plusDays(days).toString(format1);
    }

    /**
     * 返回指定时间加几天
     *
     * @param dt
     * @param days
     * @return
     */
    public static String myDatePlusDay(String dt, int days) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format1)).plusDays(days).toString(format1);
    }


    /**
     * 返回指定时间加几天
     *
     * @param dt
     * @param days
     * @return
     */
    public static String myDatePlusDayToformat4(String dt, int days) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format4)).plusDays(days).toString(format4);
    }

    /**
     * 日期转换 将yyyy-MM-dd HH:mm:ss转换成yyyyMMddHHmmss
     *
     * @param dt
     */
    public static String toFormat5(String dt) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format1)).toString(format5);
    }

    /**
     * 将传入的日期由origFormat格式转换成newFormat格式
     *
     * @param dt
     */
    public static String toFormatDate(String dt, String origFormat, String newFormat) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(origFormat)).toString(newFormat);
    }

    /**
     * 将yyyy/M/d H:m:s格式化成双日期时间
     *
     * @param dt
     */
    public static String toFormatDoubleDateTime(String dt) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format6)).toString(format1);
    }

    /**
     * 将yyyy/M/d H:m:s格式化成双日期时间  返回时分秒
     *
     * @param dt
     */
    public static String toFormatDoubleDateTimeReturnTime(String dt) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format6)).toString(format1).substring(11,19);
    }
    /**
     * 返回指定时间加分钟
     *
     * @param dt
     * @param Minutes
     * @return
     */
    public static String myDatePlusMin(String dt, int Minutes) {
        return DateTime.parse(dt, DateTimeFormat.forPattern(format1)).plusMinutes(Minutes).toString(format1);
    }

    /**
     * 获取购买影片过期时间
     *
     * @param days
     * @return
     */
    public static String getVideoEndTime(int days) {
        return LocalDateTime.now().plusDays(days).toString(format1);
    }

    /**
     * 13位时间转yyyy-MM-dd HH:mm:ss
     *
     * @param s
     * @return
     */
    public static String dbDateToStr(String s) {
        Long instant = new Long(s);
        DateTime dt = new DateTime(instant);
        return dt.minusHours(13).toString(format1);
    }

    /**
     * 传入日期与格式，判断是否超过当前时间
     *
     * @param d1 时间
     * @param ft 格式
     * @return
     */
    public static boolean isAfterNow(String d1, String ft) {
        return DateTime.parse(d1, DateTimeFormat.forPattern(ft)).isAfterNow();
    }

    /**
     * 传入日期与格式，判断是否在当前时间之前
     *
     * @param d1
     * @param ft
     * @return
     */
    public static boolean isBeforeNow(String d1, String ft) {
        return DateTime.parse(d1, DateTimeFormat.forPattern(ft)).isBeforeNow();
    }

    //获取随机一段时间内的随机时间值（下面方法调用）
    public static long random(long begin, long end) {
        long rtn = begin + (long) (Math.random() * (end - begin));
        // 如果返回的是开始时间和结束时间，则递归调用本函数查找随机值
        if (rtn == begin || rtn == end) {
            return random(begin, end);
        }
        return rtn;
    }

    /**
     * 一段时间内的随机时间值
     *
     * @param
     * @param
     * @return
     */
    public static Date randomDate(String beginDate, String endDate) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date start = format.parse(beginDate);// 构造开始日期
            Date end = format.parse(endDate);// 构造结束日期
            if (start.getTime() >= end.getTime()) {
                return null;
            }
            long date = random(start.getTime(), end.getTime());
            return new Date(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取月份的第一天
     *
     * @param
     * @return
     */
    public static String getFirstDayOfMonth() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
        String firstDay = format.format(calendar.getTime()) + " 00:00:00";
        return firstDay;
    }

    public static String getFirstDayOfMonth(String ym) {
        String arr[] = ym.split("-");

        int year = Integer.parseInt(arr[0]);
        int month = Integer.parseInt(arr[1]);

        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);

        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最小天数
        int firstDay = cal.getMinimum(Calendar.DATE);
        //设置日历中月份的最小天数
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        return sdf.format(cal.getTime());
    }

    public static String getLastDayOfMonth(String ym) {
        String arr[] = ym.split("-");

        int year = Integer.parseInt(arr[0]);
        int month = Integer.parseInt(arr[1]);

        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DATE);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }


    /**
     * 获取指定月份的最后一天
     *
     * @param
     * @return
     */
    public static String getLastDayOfMonth() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        String lastDay = format.format(calendar.getTime()) + " 23:59:59";
        return lastDay;
    }


    //将String类型转换为时间类型
    public static long fromDateStringToLong(String inVal) {
        Date date = null; // 定义时间类型
        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date = inputFormat.parse(inVal); // 将字符型转换成日期型
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date.getTime(); // 返回毫秒数
    }

    /**
     * 时间戳转yyyy-MM-dd HH:mm:ss
     * @param s
     * @return
     */
    public static String zjmdbDateToStr(String s){
        long instant = Long.parseLong(s);
        Date d = new Date(instant);
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sf.format(d);
    }

}
